f[i][j] 表示在第一个序列的前i个字母中出现并且在第二个序列的前j个字母中出现的最大值
以第i个和第j个字母是否相同来划分
如果相同 f[i][j] = f[i - 1][j - 1] + 1
如果不相同 f[i][j] = max(f[i - 1][j], f[i][j - 1])
因为如果不相同，那么此时f[i][j]的值肯定不会大于f[i - 1][j]和f[i][j - 1]的最大值
那么一定会等于f[i - 1][j]和f[i][j - 1]的最大值


#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10;
#define close(); std::ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
//----------------------------------------------------------------------------//
int a[N], b[N],f[N][N],n,m;
int main() 
{
  cin >> n >> m;
  for(int i=1;i<=n;i++) cin>>a[i];
  for(int i=1;i<=m;i++) cin>>b[i];
  	
  for (int i = 1; i <= n; i++) 
  {
    for (int j = 1; j <= m; j++) 
    {
      if (a[i] == b[j]) f[i][j] = f[i - 1][j - 1] + 1;  
      else f[i][j] = max(f[i - 1][j], f[i][j - 1]);   
    }
  }
  cout << f[n][m] << '\n';
  return 0;
}

